home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1994 / MacHack 1994.toast / MacHack™94 / Talks & Papers / Timothy Knox / yerk 3.66 / Asm source / GetOp < prev    next >
Text File  |  1994-06-24  |  5KB  |  147 lines

  1. \ GetOp                     Reese Warner            3/85
  2. \  12/17/85  JAF  created Symbols <SUPER Dictionary to deal w/ valid 0 values
  3. \  03/06/86  GDC  fixed immediate mode
  4. \  03/07/86  GDC  fixed displacement
  5. \  03/07/86  GDC  fixed PC modes (9 & 10)
  6. \ The Dreaded GetOp - builds the operand structure
  7. 25 Symbols SymTab    \ jaf 12/17/85 change Dictionary to Symbols
  8.  
  9. 0 -> dlevel
  10.  
  11. \   finds operand size
  12. : ExtSize       { addr len \ size -- Size }
  13.         addr c@
  14.         CASE
  15.             ascii L OF 2 -> Size ENDOF
  16.             ascii W OF 1 -> Size ENDOF
  17.             ascii B OF 0 -> Size ENDOF
  18.             202 AsmError                 \ bad operand size
  19.         ENDCASE
  20.         size val" ExtSize returns "
  21. ;
  22.  
  23. : GetSize   { \ Size tt -- tokenType size }
  24.     opSize -> size
  25.     nextToken -> tt
  26.     " ," get: token s=
  27.     IF
  28.         nextToken -> tt
  29.     THEN
  30.     start: token
  31.     " ." indexOf: token
  32.     IF
  33.         drop ( charOf ) nextToken drop msg" EXEC IF"
  34.         get: token extSize -> size
  35.         nextToken -> tt
  36.     THEN
  37.     tt       val" tt=" 
  38.     size     val" size="
  39. ;
  40.  
  41. : ClearOp   { opPtr -- }
  42.     0 seta/d: opPtr
  43.     0 setauxsize: opPtr
  44.     0 setReg: opPtr
  45.     0 setval: opPtr
  46.     0 setmode: opPtr
  47.     0 setauxreg: opPtr
  48.     0 setpcmode: opPtr
  49. ;
  50.  
  51. : GetOp { opPtr \ opDesc type -- }
  52.  
  53.     opptr clearOp
  54.  
  55.     getSize -> opSize -> type
  56.  
  57.     type 1 =                            \ check for 5 or 6 mode, tokentype 1
  58.     IF
  59.         get: token >num setVal: opPtr
  60.         nextToken drop
  61.         token query: operands -> opDesc
  62.         opDesc 0=
  63.         IF
  64.             203 AsmError                \ unknown operand
  65.         ELSE
  66.             mode: opDesc 2 = mode: opDesc 6 = or
  67.             mode: opDesc 9 = or mode: opDesc 10 = or
  68.             IF
  69.                 mode: opDesc dup setpcmode: opPtr
  70.                 7 min val" setMode to" setMode: opPtr
  71.                 mode: opPtr 2 = IF 5 setMode: opPtr THEN
  72.                 reg: opDesc val" setReg to" setReg: opPtr
  73.                 mode: opDesc 6 = mode: opDesc 10 = or
  74.                 IF
  75.                     nextToken drop      \ should be comma
  76.                     nextToken drop token query: operands -> opDesc
  77.                     mode: opDesc 20 = mode: opDesc 21 = or
  78.                     IF
  79.                         reg: opDesc setAuxReg: opPtr
  80.                         mode: opDesc 20 - val" a/d to" setA/D: opPtr
  81.                         1 setAuxSize: opPtr
  82.                     ELSE
  83.                         nextToken 3 =   \ should be '.', len associated with
  84.                                         \ idx reg
  85.                         IF
  86.                             reg: opDesc setAuxReg: opPtr
  87.                             mode: opDesc setA/D: opPtr
  88.                             nextToken drop get: token extSize setAuxSize: opPtr
  89.                         ELSE
  90.                             203 asmError \ unknown operand
  91.                         THEN
  92.                     THEN
  93.                 THEN        
  94.             ELSE
  95.                 203 AsmError             \ unknown operand
  96.             THEN
  97.         THEN
  98.     ELSE
  99.         token query: operands -> opDesc
  100.         opDesc 0= val" T means Label "   \ if operand is a label
  101.         IF      \ label, presumably
  102.             pass 1 = 
  103.             IF
  104.                 token query: symTab
  105.                 swap drop               \ jaf 12/17/85 remove val
  106.                 0=
  107.                 IF
  108.                     0 token enter: symTab
  109.                 THEN
  110.             ELSE                        \ Put code location into value field
  111.                 Token query: symTab
  112.                 drop                    \ jaf 12/17/85 remove flag
  113.                 codePos - 2- setVal: opPtr
  114.             THEN
  115.             9 setMode: opPtr
  116.             2 setReg: opPtr
  117.         ELSE
  118.             reg: opDesc val" reg is " setReg: opPtr
  119.             mode: opDesc val" mode is " setMode: opPtr
  120.             mode: opPtr 11 =         \ an Immediate operand
  121.             IF
  122.                 nextToken
  123.                 1 =
  124.                 IF
  125.                     get: token >num setVal: opPtr
  126.                 ELSE
  127.                     205 asmError
  128.                 THEN
  129.             THEN
  130.             mode: opPtr 8 =         \ a dict pointer,compile an immediate
  131.             IF
  132.                 11 setMode: opPtr
  133.                 4 setReg: opPtr
  134.                 nextToken drop
  135.                 nextToken drop get: token str255 -base latest (find)
  136.                 IF
  137.                     drop
  138.                     setVal: opPtr
  139.                 ELSE
  140.                     216 asmError
  141.                 THEN
  142.                 nextToken drop
  143.             THEN
  144.         THEN
  145.     THEN
  146. ;
  147.